package com.newtouch.bxzs.database.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.newtouch.bxzs.common.base.BaseErrorEnum;
import com.newtouch.bxzs.common.base.BaseException;
import com.newtouch.bxzs.common.base.em.SystemParamsEnum;
import com.newtouch.bxzs.common.base.model.SystemParameter;
import com.newtouch.bxzs.common.base.util.EntityToBeanUtils;
import com.newtouch.bxzs.common.base.util.UserDetailUtil;
import com.newtouch.bxzs.database.controller.SystemParameterController;
import com.newtouch.bxzs.database.mapper.SystemParameterMapper;
import com.newtouch.bxzs.database.model.bo.SystemParameterBO;
import com.newtouch.bxzs.database.model.vo.SystemParameterAddVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterChangeVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterVO;
import com.newtouch.bxzs.database.model.vo.SystemParameterValueVO;
import com.newtouch.bxzs.database.service.SystemParameterService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 系统参数管理service接口的实现类
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/1/5</td>
 * <td>zhangqianyang</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author zhangqianyang
 * @version 1.0.0
 * @since 1.0.0
 */
@Service
public class SystemParameterServiceImpl implements SystemParameterService {
    @Resource
    private SystemParameterMapper systemParameterMapper;

    /**
     * 静态变量：日志
     */
    private static final Log logger = LogFactory.getLog(SystemParameterController.class);

    /**
     * 获取系统参数
     *
     * @param systemParameterVO 系统参数VO类
     * @return 分页系统参数
     */
    @Override
    public IPage<SystemParameterBO> getSystemParameterList(SystemParameterVO systemParameterVO) {
        /* 判断输入页码不能为空 */
        if (systemParameterVO == null || StringUtils.isEmpty(systemParameterVO.getCurrentPage())
                || StringUtils.isEmpty(systemParameterVO.getPageSize())) {
            throw new BaseException(BaseErrorEnum.BODY_NOT_MATCH);
        }
        /* 拿到当前页和每页数量 */
        Page<SystemParameter> systemParameterPage = new Page<>(systemParameterVO.getCurrentPage(),
                systemParameterVO.getPageSize());
        // 实例化QueryWrapper
        QueryWrapper<SystemParameter> query = new QueryWrapper<>();
        /* 选择排序顺序（按照名称排序） */
        query.orderByAsc("SYSTEM_PARAMETER_NAME");
        if (!StringUtils.isEmpty(systemParameterVO.getSystemParameterName())) {
            query.like("SYSTEM_PARAMETER_NAME", systemParameterVO.getSystemParameterName());
        }
        /* 通过输入条件查询 */
        IPage<SystemParameter> iPage = systemParameterMapper.selectPage(systemParameterPage, query);
        if (iPage == null) {
            return null;
        }
        IPage<SystemParameterBO> boiPage = new Page<>();
        // 设置iPage*/
        boiPage.setRecords(EntityToBeanUtils.copyBean(iPage.getRecords(), SystemParameterBO.class));
        boiPage.setTotal(iPage.getTotal());
        boiPage.setSize(iPage.getSize());
        boiPage.setPages(iPage.getPages());
        boiPage.setCurrent(iPage.getCurrent());
        return boiPage;
    }

    /**
     * 启用/禁用系统参数
     *
     * @param systemParameterChangeVO 系统参数值修改VO类
     * @return message
     */
    @Override
    public String changeSystemParameterStatus(SystemParameterChangeVO systemParameterChangeVO) {
        /*
         * 判断systemParameterChangeVO是否为空 ||判断parameterId是否为空 || 判断enableFlag是否为空
         */
        if (systemParameterChangeVO == null || StringUtils.isEmpty(systemParameterChangeVO.getSystemParameterId())
                || StringUtils.isEmpty(systemParameterChangeVO.getEnableFlag())) {
            logger.error("修改状态输入异常");
            throw new BaseException(BaseErrorEnum.REQUEST_DATA_NULL);
        }
        /* 实例化QueryWrapper */
        QueryWrapper<SystemParameter> query = new QueryWrapper<>();
        /* 实例化SystemParameter */
        SystemParameter systemParameter = new SystemParameter();
        /* 设置ParameterId为sql条件 */
        query.eq("SYSTEM_PARAMETER_ID", systemParameterChangeVO.getSystemParameterId());
        /* 设置状态，修改人，和修改时间 */
        systemParameter.setEnableFlag(systemParameterChangeVO.getEnableFlag());
        systemParameter.setUpdateUserId(Objects.requireNonNull(UserDetailUtil.getUserDetail()).getUserId());
        systemParameter.setUpdateTime(new Date());
        /* 修改启用禁用状态 */
        systemParameterMapper.update(systemParameter, query);
        return "启用/禁用成功";
    }

    /**
     * 新增系统参数
     *
     * @param systemParameterAddVO 系统参数新增VO类
     * @return message
     */
    @Override
    public String addSystemParameter(SystemParameterAddVO systemParameterAddVO) {
        /* 新增时必填项不能为空 */
        if (systemParameterAddVO == null || StringUtils.isEmpty(systemParameterAddVO.getSystemParameterName())
                || StringUtils.isEmpty(systemParameterAddVO.getSystemParameterValue())) {
            throw new BaseException(BaseErrorEnum.REQUEST_DATA_NULL);
        }
        /* 实例化SystemParameter */
        SystemParameter systemParameter = new SystemParameter();
        /* 使用工具直接进行实体与BO的复制转换，前面是来源，后面是目标 */
        Date date = new Date();
        BeanUtil.copyProperties(systemParameterAddVO, systemParameter);
        systemParameter.setEnableFlag(false);
        systemParameter.setCreateUserId(Objects.requireNonNull(UserDetailUtil.getUserDetail()).getUserId());
        systemParameter.setCreateTime(date);
        systemParameter.setUpdateUserId(Objects.requireNonNull(UserDetailUtil.getUserDetail()).getUserId());
        systemParameter.setUpdateTime(date);
        systemParameterMapper.insert(systemParameter);
        return "新增系统参数成功";
    }

    /**
     * 获取系统参数详情
     *
     * @param parameterId 系统参数id
     * @return 系统参数详情
     */
    @Override
    public SystemParameterBO getSystemParameterDetail(String parameterId) {
        if (StringUtils.isEmpty(parameterId)) {
            logger.error("系统参数id输入为空");
            throw new BaseException(BaseErrorEnum.REQUEST_DATA_NULL);
        }
        /* 通过id查询公告 */
        SystemParameter systemParameter = systemParameterMapper.selectById(parameterId);
        if (systemParameter == null) {
            logger.error("系统参数id输入错误");
            throw new BaseException(BaseErrorEnum.REQUEST_PARAMETER_ERROR);
        }
        /* 实例化SystemParameterBO */
        SystemParameterBO systemParameterBO = new SystemParameterBO();
        /* 使用工具直接进行实体与BO的复制转换，前面是来源，后面是目标 */
        BeanUtil.copyProperties(systemParameter, systemParameterBO);
        return systemParameterBO;
    }

    /**
     * 启用/禁用系统参数
     *
     * @param systemParameterValueVO 系统参数值修改VO类
     * @return message
     */
    @Override
    public String changeSystemParameterValue(SystemParameterValueVO systemParameterValueVO) {
        /*
         * 判断systemParameterChangeVO是否为空 || 判断parameterId是否为空 ||
         * 判断parameterValue是否为空
         */
        if (systemParameterValueVO == null || StringUtils.isEmpty(systemParameterValueVO.getSystemParameterValue())
                || StringUtils.isEmpty(systemParameterValueVO.getSystemParameterId())) {
            logger.error("修改值输入异常");
            throw new BaseException(BaseErrorEnum.REQUEST_DATA_NULL);
        }
        SystemParameter systemParameterOne = systemParameterMapper.selectById(systemParameterValueVO.getSystemParameterId());
        if (BeanUtil.isEmpty(systemParameterOne)) {
            throw new BaseException(BaseErrorEnum.REQUEST_PARAMETER_ERROR);
        }
        // 通过参数code，验证正则表达式
        checkSystemParameterValue(systemParameterOne.getSystemParameterCode(),systemParameterOne.getSystemParameterName(), systemParameterValueVO.getSystemParameterValue());
        /* 实例化QueryWrapper */
        QueryWrapper<SystemParameter> query = new QueryWrapper<>();
        /* 实例化SystemParameter */
        SystemParameter systemParameter = new SystemParameter();
        /* 设置ParameterId为sql条件 */
        query.eq("SYSTEM_PARAMETER_ID", systemParameterValueVO.getSystemParameterId());
        /* 设置状态，修改人，和修改时间 */
        systemParameter.setSystemParameterValue(systemParameterValueVO.getSystemParameterValue());
        systemParameter.setUpdateUserId(Objects.requireNonNull(UserDetailUtil.getUserDetail()).getUserId());
        systemParameter.setUpdateTime(new Date());
        /* 修改启用/禁用状态 */
        systemParameterMapper.update(systemParameter, query);
        return "修改参数值成功";
    }

    /**
     * 验证系统参数值正则
     *
     * @param systemParameterName 名称
     * @param systemParameterCode  系统参数编码
     * @param systemParameterValue 系统参数值
     */
    private void checkSystemParameterValue(String systemParameterCode, String systemParameterName, String systemParameterValue) {
        if (StringUtils.isEmpty(systemParameterCode)) {
            //数据库数据错误，没有编码
            throw new BaseException(BaseErrorEnum.NOT_FOUND);
        }
        //最大撤销时间限制（日期）  -  YYYY-MM-DD
        if (SystemParamsEnum.MAX_REVOKE_DATE_LIMIT.getCode().equals(systemParameterCode)) {
            if (!systemParameterValue.matches("^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|" +
                    "1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|" +
                    "[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$")) {
                logger.error("日期异常");
                throw new BaseException(BaseErrorEnum.SYSTEM_PARAM_ERROR);
            }
        }
        //网址正则验证
        else if (SystemParamsEnum.PUSH_CUSTOMER.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.REPEAL_PUSH.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.RECEPTION_PUSH_FEEDBACK.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_INFO.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_INFO_PRESERVATION.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_INFO_CLAIMS.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_PRESERVATION.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_PRESERVATION_INFO.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_CLAIMS.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_NEW_CONTRACT.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_NEW_CONTRACT_INFO.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_EXPIRATION.getCode().equals(systemParameterCode) ||
                SystemParamsEnum.QUERY_POLICY_RENEWAL.getCode().equals(systemParameterCode)) {
            if (!systemParameterValue.matches("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]$")) {
                logger.error("网址异常");
                throw new BaseException(BaseErrorEnum.REQUEST_NETWORK_PARAMETER_ERROR);
            }
        }
        //数字正则，可为0，最大长度为12位
        else {
            if(systemParameterName.contains("接口")){
                if (!systemParameterValue.matches("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]$")) {
                    logger.error("网址异常");
                    throw new BaseException(BaseErrorEnum.REQUEST_NETWORK_PARAMETER_ERROR);
                }
            }else{
                if (!systemParameterValue.matches("^(0|[1-9][0-9]{0,11})$")) {
                    logger.error("数字异常");
                    throw new BaseException(BaseErrorEnum.SYSTEM_PARAM_ERROR);
                }
            }
        }
    }

    /**
     * (non-Javadoc)
     *
     * @see com.newtouch.bxzs.database.service.SystemParameterService#getAllSystemParameter()
     */
    @Override
    public List<SystemParameterBO> getAllSystemParameter() {
        QueryWrapper<SystemParameter> query = new QueryWrapper<>();
        query.eq("IS_ENABLE", true);
        List<SystemParameter> systemParameters = systemParameterMapper.selectList(query);
        if (!CollectionUtil.isEmpty(systemParameters)) {
            return EntityToBeanUtils.copyBean(systemParameters, SystemParameterBO.class);
        }
        return null;
    }
}
